package com.epoint.nio.socket;

import com.epoint.nio.NioUtil;

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.List;

/**
 * 该版本有个很大的问题
 *
 * while(true)太费CPU了
 *
 */
public class Server {
    public static void main(String[] args) throws Exception {
        // 1.开辟一个缓存buffer
        ByteBuffer buffer = ByteBuffer.allocate(16);

        // 2.创建服务器
        ServerSocketChannel server = ServerSocketChannel.open();

        // 2.1绑定监听端口
        server.bind(new InetSocketAddress(8080));

        // 2.2设置非阻塞
        server.configureBlocking(false);

        // 3.连接集合
        List<SocketChannel> list = new ArrayList<>();

        /**
         * 4.一直循环接受客户端
         *
         * 使用while(true) 有缺点，会一直循环下去，浪费cpu资源，如果客户端发送消息过来，我再工作，这样就好了
         *
         * 如果能让服务器感知到客户端，那就是selctor的工作了
         *
         */
        while (true){
            /**
             * 默认阻塞，但是如果之前设置了configureBlocking(false)，则非阻塞
             *
             * 因为不阻塞，所以会无线循环下去，如果没有客户端来建立连接，会返回null
             */
            SocketChannel accept = server.accept();

            if(accept != null){
                System.out.println("有一个客户端连接" + accept);

                // 设置非阻塞
                accept.configureBlocking(false);

                // 添加到集合里
                list.add(accept);
            }

            for (SocketChannel channel : list) {
                /**
                 * 默认阻塞，但是如果之前设置了configureBlocking(false)，则非阻塞
                 *
                 * 因为不阻塞，如果没有读到数据，则返回的而是0
                 */
                int read = channel.read(buffer);
                if(read > 0){
                    System.out.println("before read... " + channel);
                    buffer.flip();

                    // 打印数据
                    System.out.println(NioUtil.getStr(buffer));

                    buffer.clear();
                    System.out.println("after read... " + channel);
                }
            }
        }

    }
}
